人生苦短,你需要Python(0基础患者入门篇)
上回书说到,人生苦短,我得学学Python
今天,我们就从0基础入门开始
课程讲师:虾神
文字编辑:M姐
所以,讲的不好,语无伦次,都是虾神的锅
只有错别字,是M姐的锅
本次课程我们将重点介绍这些内容。
首先,让我们来看一下Python与ArcPy的简介
大家如果关注过Python在程序员届的地位,可以看一下TIOBE榜单,这个榜单是一个根据互联网上所有程序员在各种社区提出的问题、搜索引擎的访问以及项目代码的比重,综合计算出来的榜单,他基本上反应了当今程序开发里最流行的语言,或群体最大、最有兴趣的语言,他综合反应了这样一个趋势,目前Python排名第三位,仅次于Java和C。
实际上大家如果关注一下之前的榜单,大约从2004年开始, Python上榜,但是很多年一直都还是第8名的样子,近几年开始飙升,从去年就到了第4名,今年已经冲入了top3。
为什么建议使用Python呢?除了大家说Python强大、好用以外,实际上是因为Python有很多很好的特性。
为什么要用Python?这里有一句话说得好:人生苦短,你需要使用Python。曾经有一本书叫《代码整洁之道》,就是教你如何写出简单明了的代码。大家知道,如果一个功能有两种写法,一是用10行代码实现,二是只用3行代码实现,那么用3行代码实现的方法,无论是出错几率还是运行的效率都肯定要比10行代码强。
所以一般程序界认为,一件事情实现起来越简洁,效果就越好。比如有个实验步骤实现20步,而另外的方法只用3步就能实现了,说明3步的实现方案肯定比20步要优化。说了这么多,实际上整本书你看完之后,完全也可以浓缩为一句话就是:你要用Python——全剧终。
下面我用一张图片(图太太太长了,M姐直接略掉了)给大家看看为什么说Python十分“ 简洁”。这是一个ASF XML序列化的过程,用C语言实现需要1580行。而同样一个功能Python只需要130行。所以他的代码量只有C语言的不到1/10。所以他是代码量非常小的一种纯功能性语言。另外我还说过Python是一种全功能性的语言,有的人会问为什么叫全功能性语言,因为还有一些四代代码语言的代码量比Python还要少,但不是功能性语言,而是特定指向性功能语言。比如SQL语言,代码简单,但是他只能在数据库里使用,是一种领域性语言。Python是全功能性语言,在任何领域都能用。
总而言之:Python是一种面向对象、直译式语言,而且功能强大并完善,且具有十多年的发展历程。他的特性我们后面慢慢解释。
从代数上看(计算机发展一代二代的“代”)
我们知道计算机语言有第一代、第二代这样的分法。首先第一代语言是机器语言,基本上是以二进制为承载方式的。大家如果在网上找那种最古老的计算机“埃尼阿克”(ENIAC),他是读纸带的,在纸带上打孔,来执行。机器语言可以说是一种非常古老的语言,人类是无法直接阅读的。所以出现了第二代语言叫汇编语言,也就是以标记、符号为语言的一种载体,汇编语言是最接近硬件的一种语言,带来的问题就是我在这台机器上写的代码,换一台机器可能因为CPU架构不一样就不认。
我们经常使用的高级语言就是三代语言,三代语言主要特点是面向过程和面向对象,比如我们经常写的C和C++,实际上C还有一些特点,我们经常把他称之为“两代半”,就是在二代语言的末尾三代语言的开端,他有一部分偏向于硬件。但是像C sharp 、Java、JavaScript这样的就称之为高级语言所谓的第三代语言。
这两年又发展出来了第四代语言,自然编程语言,Python处在三代和四代之间,因为Python有着大量的包,可也用来实现四代语言的特性。
下面我举个例子。比如我有100个数字,你要在这100个数字里找到我要的那个数字,用传统语言怎么写?(下面是伪码)
for i in 100
if i==5
return i
这种方式大家看,是我们人类的思考方式吗?我们人类会这样思考的问题么?这种实际上就是计算机的方式,从头开始循环遍历,然后逐个进行判断。这是面向过程的计算机的核心思维,通过for-if这样来的语句来实现,说“如果”......“则”.......这种判断逻辑方式,就是三代语句的特点。
那么四代语言怎么做这个事情呢?四代语言模拟人的思维。我这里用一个小例子来说明,我生成10万个随机的英文名称,以及10万个人的年龄。(示例操作见视频)
可以看见,四代语言编程的时候,完全模拟的是人类的思维,我们仅需要告诉计算机,我想要做什么,就可以了,而不用是模拟计算机的思考方式。
在未来,四代语言在数据分析中的比重会越来越大,所以Python在做数据分析的时候经常会使用类似这样的包,比如pandas,numpy等,除此之外还有SQLite,超轻量级的SQL语言数据库,在Python里面内置的。所以我说拥有这些特性的Python是介于三代和四代之间的语言。
当然,有同学会想,四代语言不就是对三代语言的高级封装吗?那我们回过头来想,我们的三代语言也是二代语言的高级封装,二代语言也是把一代语言的机器编码封装成字符串,实际上可以理解为,每更高一级的代数都是对上一代语言的高级封装。
接下来我们看一下Python语言的特点,首先Python是一个脚本语言,脚本语言的三大特点是:
第一,明码编写。不像我们使用的C sharp、Java,这些语言想让计算机执行,都要编译成二进制字节码才能运行,但是Python不用,Python直接用明码编写,把代码直接拿来打开就是用ASCII码承载的明文,可以直接阅读。
第二,解释执行。所谓解释执行,就是不需要像C语言那样先编译之后,build之后才能执行
第三,命令行模式。他可以逐行执行,不需要像Java语言一样你要全部写完才能点击run才能把他运行,Jave不能是我执行到一半停下来,修改一下之后在接着运行下一句,他(Java)每一次都要从头到尾执行完。
下面介绍一下Python之父,他叫吉多·范·罗苏姆,出生在1956年,曾经是Google的工程师。他被称之为Python之父,是因为他曾经在一次旅行中得到了一些想法,然后就发明了Python语言。
那么Python有几大特点呢?
Python的第一个特点——老
Python实际上是1989年罗苏姆就完成了Python的编译器,1991年第一个编译器诞生。回过头来想一下Java是1994年诞生的,所以说,Python比Java要老三、四岁。老代表什么呢?老代表第一他的可扩展性强;第二可嵌入性强,可以嵌入到硬件中;第三,他有非常丰富的库,有很多很多的资源。可谓“见多识广”,目前在Python的代码仓库pypi中,已经收集了有好几万个包——只要你想不到,没有你找不到。
Python的第二个特点——慢
为什么慢也是特点?Python的速度确实很慢,有多慢呢?根据Google的测评,纯Python代码的运行速度只有C语言运行速度的1/30 。但是慢,也就代表了他:简单(高层封装多);易学;是一种高层语言;是一种解释性语言。
Python的第三个特点——快
或许大家会奇怪,为什么刚刚说特点是慢,现在就变成快了?Python的核心的快是什么呢?
第一,写的快;别看我们运行慢,但是我们写的快!曾经有人做过实验,无论用任何语言编写功能,Python永远是第一个完成的,当然,前提是所有人的编程基础在一个基础水准上。Python用来写web后台的时候,我曾经试过,一人写的Python的后台接口对四个人写的前台接口,因为后台用Python的话,一个实现可能也就十几行代码,而他们要接过去需要几十行代码甚至上百行代码。
第二,有一些强大的技能与技巧,可以让他的速度变的很快。
第三,Python有大量的包是用纯C语言写成的,他可以无缝的链接C语言的各种库。实际上很多时候调用的都是底层的C语言。比如numpy,或者是ArcGIS 的ArcPy都是底层纯C写成的,Python仅用于调度。
Python的第四个特点——强制缩进
这可以是Python被人诟病的一个特点。所谓强制缩进,就是他强制要求所有的代码缩进格式是一样的,可以说就是对所有代码碾压过去。在编码开发中你的代码多打了一个空格,Python都可能直接报错。
强制缩进的好处就是,代码整洁,可读性和可移植性强。
Python是一种真正的跨平台语言,他可以在多个系统上运行(Windows/Unix/Linux/Macintosh/Android)。大家可能会说Java也是,但是Java运用的是虚拟机跨平台,他需要在你的不同平台上安装Java虚拟机,才能跨平台,但Python可以移植在任何平台上。你在Windows上写的东西可以直接移到Unix上,不用改也不用部署任何东西,只要有Python环境就可以了。
Python目前主要有这些应用:数据处理、数据分析、科学计算、服务编写、网络应用、人工智能、测试等等等等。那么我们来看看Python在数据处理界的地位是什么样的。
我在GitHub上做了一系列的关键字搜索,搜索的第一个关键词是analysis(分析),大家可以看到在搜索到结果里,Python的排名第一,一共是19082个工程是Python写的。我们再搜索“人工智能”,Python依然排名第一,搜索第三个单词爬虫(crawler),以及第四个单词数据处理,第五个单词“机器学习”Python均是排名第一。搜索network(网络),Python还是第一,然后我又搜索了一些比较奇怪的单词,比如脚本(script),Python第一,搜索大数据,Python终于排名第二了。因为大数据的第一平台Hadoop,是用Java写的,所以Java排名第一。
后来我又搜索了software、spark、system、database、Desktop、test、app、web等等等等,发现Python几乎都是在前十名。最低是web,排名第六。从这个数据上我们可以看出来,Python是一个使用范围非常广泛的语言。
网上经常会有人说24小时或者48小时学会一门语言,学会Python年薪几十万不是梦。那么是不是真的你什么都不会学一个Python就够了呢?答案是否定的。因为我认为Python在实际的工作中并不起到主反应化学药剂的功能,而是作为催化剂存在的。催化剂本身不发生任何化学反应,只会让化学反应加剧,所以你如果仅会Python就来找工作不切实际,但是无论你做什么工作,如果你会Python,你会发现,无论你的工作效率还是其他等都会上一个台阶。
Python目前有两个版本共存,截止到2019年12月(当前),2.x和3.x两个版本。当然在2020年2.x版本将不在提供维护。之后所有的平台都将往3.x平台迁移。其中2.x对国内开发者不太友好的一点就是对中文编码支持非常不好。但是Python3对中文编码非常友好,甚至可以用中文进行编写代码,就是中文变量名。下面给大家看一个示例。
下面我们简单的介绍一下Python的开发工具。Python的开发工具实际上非常多。常用的开发工具都支持Python。
比如最常用的一个入门神器叫IDLE,这个工具不需要你安装任何,只要安装了Python就自带。特点是简单,不用安装,缺点是慢。所以一般来说,在工程的实际开发中,我们会采用一些专用的开发工具。
比如VS Code,这是一个轻量级的跨平台工具,微软出品。优点:轻量级、功能强大、跨平台。缺点是配置麻烦。因为他所有的配置都不是通过鼠标完成的,而是通过写配置文件完成的。适用于编写小型工具,查看代码测试。
稍微高级点的:Eclipse+PyDev
如果写Java的东西会很熟悉,当然,这些年可能又被淘汰了。优点和缺点都很突出,尤其是他是一个开源的软件。
另一个高级版:IntelliJ IDEA
核心特点是,用来写Python的那个部分是免费,但是你写别的部分,是要收费的。这是一个非常强大的编写工具,也是这些年我主要的工作平台。
终极版:PyCharm
号称Python第一开发神器。优缺点也非常突出,而且是这几个软件当中唯一一个纯商业软件。
最新&流行版:Jupyter
就是我刚刚写代码的时候给大家演示的那个工具。这是一个ode工具——Online的系统集成开发工具,也就是说他的编写界面实际上就是一个网页,既然他是一个网页,你可以把他的服务器装在某个服务器端,通过一个URL访问过去,就可以打开这个开发工具进行编程了,你所有的代码都保存在这个服务器上,执行也调用的是服务器的资源。这样的好处就是你不一定需要一个电脑进行编程了,可以用手机或者平板,只要你能打开那个网页就可以了。但是他的核心问题是,没有项目管理能力,也就是说不能进行版本之间的管理,比如他要向GitHub上提交代码,需要第三方工具,所以不适用于工程性的开发。主要适合小规模工作和教学、学习、演示这样的工作。这是目前比较流行的一个方式。
在ArcGIS里,有个最新的Python集成工具叫ArcGIS Notebook Server,他的核心就是像安装了ArcGIS的服务器一样,安装了一个Python的开发服务器,可以让你在服务端调用任何资源,你在本地不用任何安装,每个人都可以获得一个开发容器,你的所有代码都在这个容器内,不会受限于本地的计算资源或者突然断电造成的代码丢失。有兴趣的人可以试一下这个工具。
Python的语法特点,我们简单过一下。
Python的结构从下往上看,跟Java和C sharp不一样,Python最上面有一个包,包就是代码模块集合体。回头我们会介绍ArcPy,ArcPy实际上就是一个站点包。
Python的编码风格很有意思,用减号进行注释,而且还可以跨行编写。
Python标识符严格区分大小写,2.0的时候要遵循标准变量名法则,3.0的时候支持中文变量名。Python的下划线是保留字符,不能乱用,一个下划线代表内部成员的变量,两个下划线代表系统专用变量。
Python有系列关键字,Python3.x有33个。大家知道写代码不要使用关键字作为你的变量命名,否则程序一定报错。
Python的运算符和逻辑表达式,雷同与C++或者Java,但是比他们更加简洁,而且功能也更加丰富一下。
Python的真值表,主要是在做逻辑判断的时候用的,这里注意,Python2和Python3有些真值是不一样的。
Python一共有三大数据结构,列表、元祖和字典,这里就不详细介绍了,大家有兴趣的话可以去网上查阅他的相关信息。
流程控制语句,雷同与所有的三代语言中面向结构的语言部分,如果你有任何一种三代语言的编程基础,对于Python的流程控制语言就应该不用多说 ,当然,他也有一些自己特有的特性,比如列表推导式等,有兴趣的同学可以自行查阅相关资料。
函数的定义,也是一样,所不同的是,Python传参的方式,即不是引用传递,也不是值传递,而是一种称之为对象传递的方式:传入的对象是可变的,则是按引用传递,如果是不可变的,则是值传递。
Python支持面向对象,所以也有类定义的方法,也支持封装、多态和继承。
最上面是包的定义,若干的语句、函数、类,可以被集成定义为一个包,一般在物理上,都是以一个文件夹为主要承载模式。
Python编程,有个核心思想,就是要避免太慢,最大的提升执行效率,如何把Python的执行效率提升上去呢?
Python执行效率的关键就在于如何使用Python那些强大的包。Python是由一系列包组成,用好这些包,就是学习和编写Python的精髓。
我们常说Python比较容易学,容易到什么程度呢,比如你说你下午要写一个Python,你上午来学校拿一本书或者上网学2个小时,中午就能写。但是你可能会发现为什么我写的代码跟别人写的代码,执行效率差距那么大呢。所以说,虽然经常说你有编程基础,就可以很容易的使用Python,但是你写的Python代码,可能不是真正的Python思维下的代码,他是其他编程思想下面的,Python语法写出来的可以执行的语句,也就是说你可能是在用写Java的方式在写Python。你的编程风格,写出来的思维模式和内容可能都是Java的。所以,要想把Python用到极致,关键就是用好Python的包。
下面我们就看一个简单的示例来看一下Python用了包之后的效率会是什么情况。
温馨提示
在今天的学习中,M姐注意到虾神反复提到了包,于是M姐又好奇了
好吧,M姐立刻就打开看了一眼
不光看了一眼,还试了一脚
所以结局呢就是——哇哦,不明觉厉
好了,今天又是收获满满的一天
下集见
BTW,请网名叫lunarian的女同学联系我一下,你的提问未能及时回复现在已经回复不了了,如果有她的同学看到了,请帮忙提醒她一下。
关于学GIS却不想做开发方面的工作的问题,首先要明确一点:不是所有GIS相关的技术工作都是在写代码,其他我们私聊吧。
下集预告(ArcGIS中使用Python)